﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Net.NetworkInformation;

namespace GieldaCSharp
{
    class Notowania
    {
        Aktualizuj akt = new Aktualizuj();
        private Data data = new Data();

        public Notowania()
        {
            if (NetworkInterface.GetIsNetworkAvailable())
            {
                akt.Start();
                Console.WriteLine("Aktualizacja zakonczona");  
            }          
        }

        public void WczytajNotowania()
        {
            double d = 0;
            double v = 0;

            kursV kV = new kursV();
            DateTime dataOd = new DateTime(2000, 11, 17);            

            while (dataOd <= DateTime.Today)
            {
                if (dataOd.DayOfWeek != DayOfWeek.Saturday && dataOd.DayOfWeek != DayOfWeek.Sunday)
                {
                    int i = data.wezDateInt(dataOd);
                    string path = Application.StartupPath.ToString() + "\\notowania\\" + i.ToString() + ".txt";
                    if (File.Exists(path))
                    {
                        FileStream fs = new FileStream(path, FileMode.Open);
                        StreamReader sr = new StreamReader(fs);

                        try
                        {
                            kV.dataInt = i;
                            string tmpData = sr.ReadLine();
                            do //czytamy caly plik i dane dodajemy do list
                            {
                                string[] tmp = tmpData.Split(',');
                                d = Double.Parse(tmp[5].Replace('.', ','));
                                v = Double.Parse(tmp[6].Replace('.', ','));

                                if (Dane.Instance.notowania.ContainsKey(tmp[0]))
                                {
                                    kV.x = Dane.Instance.notowania[tmp[0]].Count;

                                    kV.kurs = d; //notowanie
                                    Dane.Instance.notowania[tmp[0]].Add(kV);
                                    kV.kurs = v; //wolumen
                                    Dane.Instance.wolumen[tmp[0]].Add(kV);
                                }
                                else
                                {
                                    Dane.Instance.notowania.Add(tmp[0], new List<kursV>());
                                    Dane.Instance.wolumen.Add(tmp[0], new List<kursV>());

                                    kV.x = Dane.Instance.notowania[tmp[0]].Count;

                                    kV.kurs = d; //notowanie
                                    Dane.Instance.notowania[tmp[0]].Add(kV);
                                    kV.kurs = v; //wolumen
                                    Dane.Instance.wolumen[tmp[0]].Add(kV);
                                }

                                tmpData = sr.ReadLine();
                            }
                            while (tmpData != null);

                            Dane.Instance.lastDate = i;
                            sr.Close();
                            fs.Close();
                        }
                        catch
                        {
                            Console.WriteLine("Nie mozna wczytac: " + path);

                            sr.Close();
                            fs.Close();
                            File.Delete(path);
                        }
                    }
                }
                dataOd = dataOd.AddDays(1);
            }

            if (Dane.Instance.lastDate == 0)
            {
                MessageBox.Show("Nie mozna polaczyc sie z internetem! Brak danych!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }

            //wczytanie nazw spolek dla ostatniego istniejacego pliku z danymi
            FileStream fso = new FileStream(Application.StartupPath.ToString() + "\\notowania\\" + Dane.Instance.lastDate.ToString() + ".txt", FileMode.Open);
            StreamReader sro = new StreamReader(fso);

            string tmpDatao = sro.ReadLine();
            do //czytamy caly plik i dane dodajemy do list
            {
                string[] tmp = tmpDatao.Split(',');

                Dane.Instance.spolki.Add(tmp[0]);
                tmpDatao = sro.ReadLine();
            }
            while (tmpDatao != null);

            sro.Close();
            fso.Close();
        }

        public void LiczDane(int St, int EMA, double EMAprp, double EMAprm, double PrS, double PrK, double Infl)
        {
            double kwotaPoczatkowaSpolka;
            double kwotaEMA;
            double wydatekPoczatkowyEMA;
            int liczbaAkcjiEMA;

            double srEMA = 0;
            bool kupnoEMA;
            bool startSpolka;
            double d = 0;

            int liczbaAkcjiPocz = 10000;
            double wartosc = 0;

            double K = 0;
            if (EMA != 0) K = (2.0 / (EMA + 1));

            List<kursV> lista = new List<kursV>();

            kursV kV = new kursV();
            ksV ksV = new ksV();

            // Store keys in a List
            foreach (string nazwa in Dane.Instance.spolki)
            {
                liczbaAkcjiEMA = liczbaAkcjiPocz;
                kwotaEMA = 0;
                wydatekPoczatkowyEMA = 0;
                kwotaPoczatkowaSpolka = 0;

                kupnoEMA = false;
                startSpolka = true;

                lista = Dane.Instance.notowania[nazwa];


                if (Dane.Instance.listy.ContainsKey(nazwa))
                {
                    Dane.Instance.listy[nazwa].zyskEmaV.Clear();
                    Dane.Instance.listy[nazwa].srEMAV.Clear();
                    Dane.Instance.listy[nazwa].srEMAPV.Clear();
                    Dane.Instance.listy[nazwa].srEMAMV.Clear();
                    Dane.Instance.listy[nazwa].srBUYEMAV.Clear();
                    Dane.Instance.listy[nazwa].srSELLEMAV.Clear();
                    Dane.Instance.listy[nazwa].kupnoSprzedazV.Clear();
                }
                else
                {
                    Dane.Instance.listy.Add(nazwa, new Listy());
                }


                for (int i = 0; i < lista.Count; ++i)
                {
                    d = lista[i].kurs;

                    ksV.kupno = false;
                    ksV.sprzedaz = false;

                    kV.dataInt = lista[i].dataInt;
                    kV.kurs = lista[i].kurs;
                    kV.x = lista[i].x;

                    if (lista[i].dataInt >= St && startSpolka) { kwotaPoczatkowaSpolka = d; startSpolka = false; }

                    //wskaznik EMA
                    if (EMA != 0)
                    {
                        if (lista[i].x >= EMA)
                        {
                            srEMA = d * K + srEMA * (1 - K);

                            kV.kurs = (srEMA + srEMA * (EMAprp / 100));
                            Dane.Instance.listy[nazwa].srEMAPV.Add(kV);

                            kV.kurs = srEMA;
                            Dane.Instance.listy[nazwa].srEMAV.Add(kV);

                            kV.kurs = (srEMA - srEMA * (EMAprm / 100));
                            Dane.Instance.listy[nazwa].srEMAMV.Add(kV);
                        }
                        else
                        {
                            srEMA += d;
                            if (lista[i].x == (EMA - 1))
                            {
                                srEMA /= EMA;

                                kV.kurs = (srEMA + srEMA * (EMAprp / 100));
                                Dane.Instance.listy[nazwa].srEMAPV.Add(kV);

                                kV.kurs = srEMA;
                                Dane.Instance.listy[nazwa].srEMAV.Add(kV);

                                kV.kurs = (srEMA - srEMA * (EMAprm / 100));
                                Dane.Instance.listy[nazwa].srEMAMV.Add(kV);
                            }
                        }

                        //INFLACJA EMA
                        if (lista[i].dataInt >= St)
                        {
                            kwotaEMA = kwotaEMA - ((kwotaEMA * (Infl / 365)) / 100);

                            //SPRZEDAZ EMA
                            if ((kupnoEMA == true) && ((d - (srEMA - srEMA * (EMAprm / 100))) < 0))
                            {
                                kV.kurs = d;
                                ksV.sprzedaz = true;
                                Dane.Instance.listy[nazwa].srSELLEMAV.Add(kV);


                                kupnoEMA = false;

                                if (wydatekPoczatkowyEMA != 0)
                                {
                                    kwotaEMA += liczbaAkcjiEMA * d;

                                    double prowizja = ((kwotaEMA * PrS) / 100);
                                    if (prowizja < 3) prowizja = 3;
                                    kwotaEMA = kwotaEMA - prowizja;

                                    kwotaEMA = kwotaEMA - prowizja;
                                    liczbaAkcjiEMA = 0;

                                    double zysktmp = (((kwotaEMA + (liczbaAkcjiEMA * d)) * 100) / wydatekPoczatkowyEMA) - 100;
                                }
                            }

                            //KUPNO EMA
                            if ((kupnoEMA == false) && ((d - (srEMA + srEMA * (EMAprp / 100))) > 0))
                            {
                                kV.kurs = d;
                                ksV.kupno = true;
                                Dane.Instance.listy[nazwa].srBUYEMAV.Add(kV);
                                kupnoEMA = true;

                                if (wydatekPoczatkowyEMA == 0)
                                {
                                    wydatekPoczatkowyEMA = liczbaAkcjiEMA * d;
                                }
                                else
                                {
                                    double prowizja = ((kwotaEMA * PrK) / 100);
                                    if (prowizja < 3) prowizja = 3;
                                    kwotaEMA = kwotaEMA - prowizja;
                                    liczbaAkcjiEMA = Convert.ToInt32(Math.Floor(kwotaEMA / d));
                                    kwotaEMA -= liczbaAkcjiEMA * d;
                                }
                            }

                            //PODSUMOWANIE EMA
                            if (wydatekPoczatkowyEMA != 0)
                            {
                                wartosc = (kwotaEMA + liczbaAkcjiEMA * d) / liczbaAkcjiPocz;
                                kV.kurs = wartosc;
                                Dane.Instance.listy[nazwa].zyskEmaV.Add(kV);
                            }
                        }
                    }

                    Dane.Instance.listy[nazwa].kupnoSprzedazV.Add(ksV);
                }


                Dane.Instance.listy[nazwa].zyskSpolka = ((d - kwotaPoczatkowaSpolka) * 100) / kwotaPoczatkowaSpolka;

                kwotaEMA += liczbaAkcjiEMA * d;
                Dane.Instance.listy[nazwa].zyskEMA = ((kwotaEMA * 100) / wydatekPoczatkowyEMA) - 100;

                Dane.Instance.listy[nazwa].N = lista.Count - 1;             
            }
        } 
    }
}
